#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <scsi/sg.h>
#include <sys/ioctl.h>

#define BUFFER_SIZE 512
#define SG_DEVICE "/dev/sg1"
// 定义一个简单的 SCSI 命令结构

int main() {
    int fd;
    struct sg_io_hdr io_hdr;
    unsigned char sense_buffer[64];
    unsigned char result_buffer[BUFFER_SIZE];
    unsigned char scsi_cmd[6] = {0x12, 0x00, 0x00, 0x00, 0x80, 0x00};

    // 打开 sg 设备
    fd = open(SG_DEVICE, O_RDWR);
    if (fd < 0) {
        perror("open");
        exit(EXIT_FAILURE);
    }

    // 初始化 sg_io_hdr 结构
    memset(&io_hdr, 0, sizeof(io_hdr));
    io_hdr.interface_id = 'S';  // 表示这是一个 sg 接口
    io_hdr.cmdp = scsi_cmd;
    io_hdr.cmd_len = sizeof(scsi_cmd);
    io_hdr.dxfer_direction = SG_DXFER_FROM_DEV;  // 从设备读取数据
    io_hdr.dxferp = result_buffer;
    io_hdr.dxfer_len = sizeof(result_buffer);
    io_hdr.sbp = sense_buffer;
    io_hdr.mx_sb_len = sizeof(sense_buffer);
    io_hdr.timeout = 60000;  // 超时时间（毫秒）
    io_hdr.pack_id = 0;
    io_hdr.usr_ptr = NULL;

    // 下发 SCSI 命令
    if (ioctl(fd, SG_IO, &io_hdr) < 0) {
        perror("ioctl");
        close(fd);
        exit(EXIT_FAILURE);
    }

    // 检查命令状态
    if (io_hdr.status != 0) {
        fprintf(stderr, "SCSI command failed with status: 0x%0x\n", io_hdr.status);
        close(fd);
        exit(EXIT_FAILURE);
    }

    // 打印结果
    printf("SCSI Inquiry Data:\n");
    char *vender = (char *)(result_buffer + 8);
    printf("  Vendor: %s\n", vender);
    char *product = (char *)(result_buffer + 32);
    printf("  Product: %s\n", product);
    close(fd);
    return 0;
}